#pragma once
#include "ThostFtdcTraderApi.h"
#include "threadlock.h"
#include <string>
#include "sharedqueue.h"
#include "CTPHelper.h"


namespace tradeadapter
{
	namespace ctp
	{
		class CCTPExchangeAdapter;
		//change ctp be sync
		class CCTPMsgHandler : public CThostFtdcTraderSpi
		{
		private:

			std::vector<CThostFtdcInvestorPositionField> m_vec;
			int m_CThostFtdcInvestorPositionFieldnRequestID;

			blockabledqueue<SyncData> m_datas;

			bool EnqueueData(EventType evtype ,void* pdata, int sizedata,CThostFtdcRspInfoField* prsp);
		public:
			std::pair<int,tstring> m_lastError;	


		public:
			CCTPMsgHandler(CCTPExchangeAdapter* parent);
			~CCTPMsgHandler(void);
			CCTPExchangeAdapter* m_parentAdapter;

			virtual void OnFrontConnected();
			SyncData GetReply(EventType eventtype,int timeout = 10*1000);
			SyncData GetReplys(std::vector<EventType> types,int timeout = 10*1000);

			//void SetLastError(CThostFtdcRspInfoField *pRspInfo);

			virtual void OnFrontDisconnected( int nReason );

			virtual void OnHeartBeatWarning( int nTimeLapse );

			virtual void OnRspAuthenticate( CThostFtdcRspAuthenticateField *pRspAuthenticateField, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRspUserLogin( CThostFtdcRspUserLoginField *pRspUserLogin, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRspUserLogout( CThostFtdcUserLogoutField *pUserLogout, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRspUserPasswordUpdate( CThostFtdcUserPasswordUpdateField *pUserPasswordUpdate, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRspTradingAccountPasswordUpdate( CThostFtdcTradingAccountPasswordUpdateField *pTradingAccountPasswordUpdate, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRspOrderInsert( CThostFtdcInputOrderField *pInputOrder, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRspParkedOrderInsert( CThostFtdcParkedOrderField *pParkedOrder, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRspParkedOrderAction( CThostFtdcParkedOrderActionField *pParkedOrderAction, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRspOrderAction( CThostFtdcInputOrderActionField *pInputOrderAction, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRspQueryMaxOrderVolume( CThostFtdcQueryMaxOrderVolumeField *pQueryMaxOrderVolume, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRspSettlementInfoConfirm( CThostFtdcSettlementInfoConfirmField *pSettlementInfoConfirm, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRspRemoveParkedOrder( CThostFtdcRemoveParkedOrderField *pRemoveParkedOrder, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRspRemoveParkedOrderAction( CThostFtdcRemoveParkedOrderActionField *pRemoveParkedOrderAction, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRspQryOrder( CThostFtdcOrderField *pOrder, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRspQryTrade( CThostFtdcTradeField *pTrade, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRspQryInvestorPosition( CThostFtdcInvestorPositionField *pInvestorPosition, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRspQryTradingAccount( CThostFtdcTradingAccountField *pTradingAccount, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRspQryInvestor( CThostFtdcInvestorField *pInvestor, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRspQryTradingCode( CThostFtdcTradingCodeField *pTradingCode, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRspQryInstrumentMarginRate( CThostFtdcInstrumentMarginRateField *pInstrumentMarginRate, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRspQryInstrumentCommissionRate( CThostFtdcInstrumentCommissionRateField *pInstrumentCommissionRate, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRspQryExchange( CThostFtdcExchangeField *pExchange, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRspQryInstrument( CThostFtdcInstrumentField *pInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRspQryDepthMarketData( CThostFtdcDepthMarketDataField *pDepthMarketData, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRspQrySettlementInfo( CThostFtdcSettlementInfoField *pSettlementInfo, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRspQryTransferBank( CThostFtdcTransferBankField *pTransferBank, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRspQryInvestorPositionDetail( CThostFtdcInvestorPositionDetailField *pInvestorPositionDetail, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRspQryNotice( CThostFtdcNoticeField *pNotice, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRspQrySettlementInfoConfirm( CThostFtdcSettlementInfoConfirmField *pSettlementInfoConfirm, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRspQryInvestorPositionCombineDetail( CThostFtdcInvestorPositionCombineDetailField *pInvestorPositionCombineDetail, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRspQryCFMMCTradingAccountKey( CThostFtdcCFMMCTradingAccountKeyField *pCFMMCTradingAccountKey, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRspQryEWarrantOffset( CThostFtdcEWarrantOffsetField *pEWarrantOffset, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRspQryTransferSerial( CThostFtdcTransferSerialField *pTransferSerial, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRspQryAccountregister( CThostFtdcAccountregisterField *pAccountregister, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRspError( CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRtnOrder( CThostFtdcOrderField *pOrder );

			virtual void OnRtnTrade( CThostFtdcTradeField *pTrade );

			virtual void OnErrRtnOrderInsert( CThostFtdcInputOrderField *pInputOrder, CThostFtdcRspInfoField *pRspInfo );

			virtual void OnErrRtnOrderAction( CThostFtdcOrderActionField *pOrderAction, CThostFtdcRspInfoField *pRspInfo );

			virtual void OnRtnInstrumentStatus( CThostFtdcInstrumentStatusField *pInstrumentStatus );

			virtual void OnRtnTradingNotice( CThostFtdcTradingNoticeInfoField *pTradingNoticeInfo );

			virtual void OnRtnErrorConditionalOrder( CThostFtdcErrorConditionalOrderField *pErrorConditionalOrder );

			virtual void OnRspQryContractBank( CThostFtdcContractBankField *pContractBank, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRspQryParkedOrder( CThostFtdcParkedOrderField *pParkedOrder, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRspQryParkedOrderAction( CThostFtdcParkedOrderActionField *pParkedOrderAction, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRspQryTradingNotice( CThostFtdcTradingNoticeField *pTradingNotice, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRspQryBrokerTradingParams( CThostFtdcBrokerTradingParamsField *pBrokerTradingParams, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRspQryBrokerTradingAlgos( CThostFtdcBrokerTradingAlgosField *pBrokerTradingAlgos, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRtnFromBankToFutureByBank( CThostFtdcRspTransferField *pRspTransfer );

			virtual void OnRtnFromFutureToBankByBank( CThostFtdcRspTransferField *pRspTransfer );

			virtual void OnRtnRepealFromBankToFutureByBank( CThostFtdcRspRepealField *pRspRepeal );

			virtual void OnRtnRepealFromFutureToBankByBank( CThostFtdcRspRepealField *pRspRepeal );

			virtual void OnRtnFromBankToFutureByFuture( CThostFtdcRspTransferField *pRspTransfer );

			virtual void OnRtnFromFutureToBankByFuture( CThostFtdcRspTransferField *pRspTransfer );

			virtual void OnRtnRepealFromBankToFutureByFutureManual( CThostFtdcRspRepealField *pRspRepeal );

			virtual void OnRtnRepealFromFutureToBankByFutureManual( CThostFtdcRspRepealField *pRspRepeal );

			virtual void OnRtnQueryBankBalanceByFuture( CThostFtdcNotifyQueryAccountField *pNotifyQueryAccount );

			virtual void OnErrRtnBankToFutureByFuture( CThostFtdcReqTransferField *pReqTransfer, CThostFtdcRspInfoField *pRspInfo );

			virtual void OnErrRtnFutureToBankByFuture( CThostFtdcReqTransferField *pReqTransfer, CThostFtdcRspInfoField *pRspInfo );

			virtual void OnErrRtnRepealBankToFutureByFutureManual( CThostFtdcReqRepealField *pReqRepeal, CThostFtdcRspInfoField *pRspInfo );

			virtual void OnErrRtnRepealFutureToBankByFutureManual( CThostFtdcReqRepealField *pReqRepeal, CThostFtdcRspInfoField *pRspInfo );

			virtual void OnErrRtnQueryBankBalanceByFuture( CThostFtdcReqQueryAccountField *pReqQueryAccount, CThostFtdcRspInfoField *pRspInfo );

			virtual void OnRtnRepealFromBankToFutureByFuture( CThostFtdcRspRepealField *pRspRepeal );
			virtual void OnRtnRepealFromFutureToBankByFuture( CThostFtdcRspRepealField *pRspRepeal );

			virtual void OnRspFromBankToFutureByFuture( CThostFtdcReqTransferField *pReqTransfer, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRspFromFutureToBankByFuture( CThostFtdcReqTransferField *pReqTransfer, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRspQueryBankAccountMoneyByFuture( CThostFtdcReqQueryAccountField *pReqQueryAccount, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast );

			virtual void OnRtnOpenAccountByBank( CThostFtdcOpenAccountField *pOpenAccount );

			virtual void OnRtnCancelAccountByBank( CThostFtdcCancelAccountField *pCancelAccount );

			virtual void OnRtnChangeAccountByBank( CThostFtdcChangeAccountField *pChangeAccount );

		};

	}
}